package Thread.Synchroized03;

/*
注意：静态同步方法区别于同步方法

    卖票案例出现了线程安全问题
        卖出了不存在和重复的票

    解决线程安全问题的一种方案：使用静态同步方法
    格式：
       修饰符 static   返回值类型  方法名 （参数列表）{
       synchronized (Runnable01.class) {
            可能会出现线程安全问题的代码
       }
    }
*/
public class Runnable01 implements Runnable {
    //指定票数为100
    private static int tickets = 100;

    @Override
    public void run() {
        while (true) {
            sellTicket();
        }
    }

    //定义一个同步方法
/*
    同步方法也会把内部的代码锁住，只允许一个线程执行
    同步方法锁对象是 实现类对象 Runnable01
*/
    public static void sellTicket() {
        synchronized (Runnable01.class) {
            if (tickets > 0) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("正在卖地第" + tickets + "张票");
                tickets--;
            }
        }
    }
}
